package org.batatasframework.support.format;

import java.util.ArrayList;
import java.util.List;

import org.batatasframework.support.database.FieldShiftable;
import org.batatasframework.support.type.OptionalMatchable;
import org.batatasframework.support.type.OptionalType;


/**
 * <pre>
 * 选项定义的格式化处理，这里依赖于{@link OptionalType}对象，是对{@link OptionalType}类型的格式化定义；
 * 除了原对象类型{@link OptionalType}，在格式化的定义里还可以添加自己的定义解析项{@link OptionalMatchable}，
 * </pre>
 * @author jackson
 *
 */
/**
 * @author Administrator
 *
 */
public class OptionalFormat implements FieldShiftable{
	
	/** 选项类型的对象 */
	private final OptionalType options;
	
	/** 当所选择的项不在指定的范围内的时候，显示的名字； */
	private final String nullName;
	
	/** 是否统计或显示不在定义范围内的选项； */
	private boolean nullable = true;
	
	/** 除了显示匹配的选项内容外，还可以自定义的匹配内容；如：A、B、AB等选项 */
	private List<OptionalMatchable> matchs = new ArrayList<>();
	
	public OptionalFormat(OptionalType options, String nullName, boolean nullable){
		this.options = options;
		this.nullName = nullName;
		this.nullable = nullable;
		
		this.matchs.addAll(options.getSources());
	}
	
	public OptionalFormat(OptionalType options){
		this(options, " - ", false);
	}
	
	public static OptionalFormat muitiple(String nullName, boolean nullable, String...items){
		return new OptionalFormat(OptionalType.multiple().add(items), nullName, nullable);
	}

	public static OptionalFormat muitiple(String...items){
		return new OptionalFormat(OptionalType.multiple().add(items));
	}

	public static OptionalFormat single(String nullName, boolean nullable, String...items){
		return new OptionalFormat(OptionalType.single().add(items), nullName, nullable);
	}

	public static OptionalFormat single(String...items){
		return new OptionalFormat(OptionalType.single().add(items));
	}

	/**
	 * 可以另外添加自定义的显示列
	 */
	public void append(OptionalMatchable match){
		this.matchs.add(match);
	}

	public void append(int index, OptionalMatchable match){
		this.matchs.add(index, match);
	}
	
	public String format(Long value) {
		return options.show(value);
	}

	public String getNullName() {
		return nullName;
	}

	public boolean isNullable() {
		return nullable;
	}

	public List<? extends OptionalMatchable> getOptions() {
		return matchs;
	}
	
	@Override
	public List<? extends OptionalEntry> getSources(){
		return options.getSources();
	}

	@Override
	public boolean isMultiple() {
		return options.isMultiple();
	}
	
	@Override
	public long maxValue() {
		return options.maxValue();
	}
	
	@Override
	public long minValue() {
		return options.minValue();
	}

	public void remove(int index){
		matchs.remove(index);
	}
}
